<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <!-- 
      undefined:未定义的值 。这个值的语义是，希望表示一个变量最原始的状态，而非人为操作的结果 。 
      这种原始状态会在以下 4 种场景中出现：
        1.声明一个变量，但是没有赋值
          var a 
          console.log(a) //undefined
        2.访问对象上不存在的属性或者未定义的变量
        3.函数定义了形参，但没有传递实参
          //函数定义了形参 a
          function fn(a) {
              console.log(a); // undefined
          }
          fn(); //未传递实参
        4.使用void对表达式求值
      
        null：空值 。这个值的语义是，希望表示一个对象被人为的重置为空对象，而非一个变量最原始的状态
        在内存里的表示就是，栈中的变量没有指向堆中的内存对象
      两种情况下我们会将变量赋值为bull
          1.如果定义的变量在将来用于保存对象，那么最好将该变量初始化为null，而不是其他值。
            换句话说，只要意在保存对象的变量还没有真正保存对象，就应该明确地让该变量保存null值，
            这样有助于进一步区分null和undefined。
          2.当一个数据不再需要使用时，我们最好通过将其值设置为null来释放其引用，这个做法叫做解除引用。
        

        特殊的typeof null
          typeof null返回的是object
          1.一方面从逻辑角度来看，null值表示一个空对象指针，它代表的其实就是一个空对象，
            所以使用typeof操作符检测时返回"object"也是可以理解的。
          
        用一句话总结两者的区别就是：undefined 表示一个变量自然的、最原始的状态值，而 null 则表示一个变量被人为的设置为空对象，而不是原始状态。
     -->
  </body>
</html>
